import java.util.*;
public class Main{
    public static void main(String[] args) {
        double re = 0;//返回值
        Scanner cin = new Scanner(System.in);
        double d1 = cin.nextDouble();//两个城市之间的距离D1
        double c = cin.nextDouble();//汽车油箱的容量
        double d2 = cin.nextDouble();//每升汽油能行驶的距离
        double p = cin.nextDouble();//出发点每升汽油价格P,后面作为当前价格使用
        final double canGo = c*d2;//最远可走距离
        double[][] the = new double[cin.nextInt()][2];
        for(double[] ta:the) {
            ta[0] = cin.nextDouble();
            ta[1] = cin.nextDouble();
        }
        int i = 0;
        double gos = 0;//已走距离
        double min = Double.MAX_VALUE;
        double tmph = 0;//上次剩余油
        for(int n = 0;true;++n){
            if(n >= the.length) {//冲刺
                re+= (d1 - gos)/d2*p;
                break;
            }
            if(i == -1){//回 归 运 动
                if((n<the.length-1 && canGo<the[n+1][0] - gos)||(n==the.length-1 && canGo<d1 - gos)){
                    System.out.print("No Solution");
                    return;
                }
                re +=(c-tmph)*p;
                tmph = c;
                tmph -= (the[n][0]-gos)/d2;
                gos = the[n][0];
                p=the[n][1];
                i=0;
                continue;
            }
            if(canGo<the[n][0]-gos){//在可行范围外
                n = i-1;
                i = -1;
                continue;
            }
            if(p >= the[n][1]){//遇到可以中转的站点
                tmph -= (the[n][0]-gos)/d2;
                if(tmph<0){
                    re+=p*(-tmph);
                    tmph = 0;
                }
                gos = the[n][0];
                p = the[n][1];
                min = Double.MAX_VALUE;
                continue;
            }
            if(min > the[n][1]) {//如果最小值(但比当前大)
                min = the[n][1];
                i = n;
            }
        }
        System.out.printf("%.2f\n", re);
    }
}